<!doctype html>
<html>
<head>
<meta charset='UTF-8'><meta name='viewport' content='width=device-width initial-scale=1'>
<title>start</title><link href='https://fonts.googleapis.com/css?family=Merriweather:900,900italic,300,300italic&subset=latin-ext' rel='stylesheet' type='text/css' />
<link href='https://fonts.googleapis.com/css?family=Lato:900,300&subset=latin-ext' rel='stylesheet' type='text/css' /><style type='text/css'>html {overflow-x: initial !important;}:root { --bg-color:#ffffff; --text-color:#333333; --select-text-bg-color:#B5D6FC; --select-text-font-color:auto; --monospace:"Lucida Console",Consolas,"Courier",monospace; }
html { font-size: 14px; background-color: var(--bg-color); color: var(--text-color); font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; -webkit-font-smoothing: antialiased; }
body { margin: 0px; padding: 0px; height: auto; bottom: 0px; top: 0px; left: 0px; right: 0px; font-size: 1rem; line-height: 1.42857; overflow-x: hidden; background: inherit; }
iframe { margin: auto; }
a.url { word-break: break-all; }
a:active, a:hover { outline: 0px; }
.in-text-selection, ::selection { text-shadow: none; background: var(--select-text-bg-color); color: var(--select-text-font-color); }
#write { margin: 0px auto; height: auto; width: inherit; word-break: normal; word-wrap: break-word; position: relative; white-space: normal; padding-bottom: 70px; overflow-x: visible; }
.first-line-indent #write div, .first-line-indent #write li, .first-line-indent #write p { text-indent: 2em; }
.first-line-indent #write div :not(p):not(div), .first-line-indent #write div.md-htmlblock-container, .first-line-indent #write p *, .first-line-indent pre { text-indent: 0px; }
.for-image #write { padding-left: 8px; padding-right: 8px; }
body.typora-export { padding-left: 30px; padding-right: 30px; }
@media screen and (max-width: 500px) {
  body.typora-export { padding-left: 0px; padding-right: 0px; }
  .CodeMirror-sizer { margin-left: 0px !important; }
  .CodeMirror-gutters { display: none !important; }
}
#write > blockquote:first-child, #write > div:first-child, #write > figure:first-child, #write > ol:first-child, #write > p:first-child, #write > pre:first-child, #write > ul:first-child { margin-top: 30px; }
#write li > figure:first-child { margin-top: -20px; }
#write ol, #write ul { position: relative; }
img { max-width: 100%; vertical-align: middle; }
button, input, select, textarea { color: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; font-size: inherit; line-height: inherit; font-family: inherit; }
input[type="checkbox"], input[type="radio"] { line-height: normal; padding: 0px; }
*, ::after, ::before { box-sizing: border-box; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p, #write pre { width: inherit; }
#write h1, #write h2, #write h3, #write h4, #write h5, #write h6, #write p { position: relative; }
h1, h2, h3, h4, h5, h6 { break-after: avoid-page; break-inside: avoid; orphans: 2; }
p { orphans: 4; }
h1 { font-size: 2rem; }
h2 { font-size: 1.8rem; }
h3 { font-size: 1.6rem; }
h4 { font-size: 1.4rem; }
h5 { font-size: 1.2rem; }
h6 { font-size: 1rem; }
.md-math-block, .md-rawblock, h1, h2, h3, h4, h5, h6, p { margin-top: 1rem; margin-bottom: 1rem; }
.hidden { display: none; }
.md-blockmeta { color: rgb(204, 204, 204); font-weight: 700; font-style: italic; }
a { cursor: pointer; }
sup.md-footnote { padding: 2px 4px; background-color: rgba(238, 238, 238, 0.7); color: rgb(85, 85, 85); border-radius: 4px; cursor: pointer; }
sup.md-footnote a, sup.md-footnote a:hover { color: inherit; text-transform: inherit; text-decoration: inherit; }
#write input[type="checkbox"] { cursor: pointer; width: inherit; height: inherit; }
figure { overflow-x: auto; margin: 1.2em 0px; max-width: calc(100% + 16px); padding: 0px; }
figure > table { margin: 0px !important; }
tr { break-inside: avoid; break-after: auto; }
thead { display: table-header-group; }
table { border-collapse: collapse; border-spacing: 0px; width: 100%; overflow: auto; break-inside: auto; text-align: left; }
table.md-table td { min-width: 80px; }
.CodeMirror-gutters { border-right: 0px; background-color: inherit; }
.CodeMirror { text-align: left; }
.CodeMirror-placeholder { opacity: 0.3; }
.CodeMirror pre { padding: 0px 4px; }
.CodeMirror-lines { padding: 0px; }
div.hr:focus { cursor: none; }
#write pre { white-space: pre-wrap; }
#write.fences-no-line-wrapping pre { white-space: pre; }
#write pre.ty-contain-cm { white-space: normal; }
.CodeMirror-gutters { margin-right: 4px; }
.md-fences { font-size: 0.9rem; display: block; break-inside: avoid; text-align: left; overflow: visible; white-space: pre; background: inherit; position: relative !important; }
.md-diagram-panel { width: 100%; margin-top: 10px; text-align: center; padding-top: 0px; padding-bottom: 8px; overflow-x: auto; }
#write .md-fences.mock-cm { white-space: pre-wrap; }
.md-fences.md-fences-with-lineno { padding-left: 0px; }
#write.fences-no-line-wrapping .md-fences.mock-cm { white-space: pre; overflow-x: auto; }
.md-fences.mock-cm.md-fences-with-lineno { padding-left: 8px; }
.CodeMirror-line, twitterwidget { break-inside: avoid; }
.footnotes { opacity: 0.8; font-size: 0.9rem; margin-top: 1em; margin-bottom: 1em; }
.footnotes + .footnotes { margin-top: 0px; }
.md-reset { margin: 0px; padding: 0px; border: 0px; outline: 0px; vertical-align: top; background: 0px 0px; text-decoration: none; text-shadow: none; float: none; position: static; width: auto; height: auto; white-space: nowrap; cursor: inherit; -webkit-tap-highlight-color: transparent; line-height: normal; font-weight: 400; text-align: left; box-sizing: content-box; direction: ltr; }
li div { padding-top: 0px; }
blockquote { margin: 1rem 0px; }
li .mathjax-block, li p { margin: 0.5rem 0px; }
li { margin: 0px; position: relative; }
blockquote > :last-child { margin-bottom: 0px; }
blockquote > :first-child, li > :first-child { margin-top: 0px; }
.footnotes-area { color: rgb(136, 136, 136); margin-top: 0.714rem; padding-bottom: 0.143rem; white-space: normal; }
#write .footnote-line { white-space: pre-wrap; }
@media print {
  body, html { border: 1px solid transparent; height: 99%; break-after: avoid; break-before: avoid; }
  #write { margin-top: 0px; border-color: transparent !important; }
  .typora-export * { -webkit-print-color-adjust: exact; }
  html.blink-to-pdf { font-size: 13px; }
  .typora-export #write { padding-left: 1cm; padding-right: 1cm; padding-bottom: 0px; break-after: avoid; }
  .typora-export #write::after { height: 0px; }
  @page { margin: 20mm 0px; }
}
.footnote-line { margin-top: 0.714em; font-size: 0.7em; }
a img, img a { cursor: pointer; }
pre.md-meta-block { font-size: 0.8rem; min-height: 0.8rem; white-space: pre-wrap; background: rgb(204, 204, 204); display: block; overflow-x: hidden; }
p > img:only-child { display: block; margin: auto; }
p > .md-image:only-child { display: inline-block; width: 100%; text-align: center; }
#write .MathJax_Display { margin: 0.8em 0px 0px; }
.md-math-block { width: 100%; }
.md-math-block:not(:empty)::after { display: none; }
[contenteditable="true"]:active, [contenteditable="true"]:focus { outline: 0px; box-shadow: none; }
.md-task-list-item { position: relative; list-style-type: none; }
.task-list-item.md-task-list-item { padding-left: 0px; }
.md-task-list-item > input { position: absolute; top: 0px; left: 0px; margin-left: -1.2em; margin-top: calc(1em - 10px); }
.math { font-size: 1rem; }
.md-toc { min-height: 3.58rem; position: relative; font-size: 0.9rem; border-radius: 10px; }
.md-toc-content { position: relative; margin-left: 0px; }
.md-toc-content::after, .md-toc::after { display: none; }
.md-toc-item { display: block; color: rgb(65, 131, 196); }
.md-toc-item a { text-decoration: none; }
.md-toc-inner:hover { }
.md-toc-inner { display: inline-block; cursor: pointer; }
.md-toc-h1 .md-toc-inner { margin-left: 0px; font-weight: 700; }
.md-toc-h2 .md-toc-inner { margin-left: 2em; }
.md-toc-h3 .md-toc-inner { margin-left: 4em; }
.md-toc-h4 .md-toc-inner { margin-left: 6em; }
.md-toc-h5 .md-toc-inner { margin-left: 8em; }
.md-toc-h6 .md-toc-inner { margin-left: 10em; }
@media screen and (max-width: 48em) {
  .md-toc-h3 .md-toc-inner { margin-left: 3.5em; }
  .md-toc-h4 .md-toc-inner { margin-left: 5em; }
  .md-toc-h5 .md-toc-inner { margin-left: 6.5em; }
  .md-toc-h6 .md-toc-inner { margin-left: 8em; }
}
a.md-toc-inner { font-size: inherit; font-style: inherit; font-weight: inherit; line-height: inherit; }
.footnote-line a:not(.reversefootnote) { color: inherit; }
.md-attr { display: none; }
.md-fn-count::after { content: "."; }
code, pre, samp, tt { font-family: var(--monospace); }
kbd { margin: 0px 0.1em; padding: 0.1em 0.6em; font-size: 0.8em; color: rgb(36, 39, 41); background: rgb(255, 255, 255); border: 1px solid rgb(173, 179, 185); border-radius: 3px; box-shadow: rgba(12, 13, 14, 0.2) 0px 1px 0px, rgb(255, 255, 255) 0px 0px 0px 2px inset; white-space: nowrap; vertical-align: middle; }
.md-comment { color: rgb(162, 127, 3); opacity: 0.8; font-family: var(--monospace); }
code { text-align: left; vertical-align: initial; }
a.md-print-anchor { white-space: pre !important; border-width: initial !important; border-style: none !important; border-color: initial !important; display: inline-block !important; position: absolute !important; width: 1px !important; right: 0px !important; outline: 0px !important; background: 0px 0px !important; text-decoration: initial !important; text-shadow: initial !important; }
.md-inline-math .MathJax_SVG .noError { display: none !important; }
.md-math-block .MathJax_SVG_Display { text-align: center; margin: 0px; position: relative; text-indent: 0px; max-width: none; max-height: none; min-height: 0px; min-width: 100%; width: auto; overflow-y: hidden; display: block !important; }
.MathJax_SVG_Display, .md-inline-math .MathJax_SVG_Display { width: auto; margin: inherit; display: inline-block !important; }
.MathJax_SVG .MJX-monospace { font-family: var(--monospace); }
.MathJax_SVG .MJX-sans-serif { font-family: sans-serif; }
.MathJax_SVG { display: inline; font-style: normal; font-weight: 400; line-height: normal; zoom: 90%; text-indent: 0px; text-align: left; text-transform: none; letter-spacing: normal; word-spacing: normal; word-wrap: normal; white-space: nowrap; float: none; direction: ltr; max-width: none; max-height: none; min-width: 0px; min-height: 0px; border: 0px; padding: 0px; margin: 0px; }
.MathJax_SVG * { transition: none; }
.MathJax_SVG_Display svg { vertical-align: middle !important; margin-bottom: 0px !important; }
.os-windows.monocolor-emoji .md-emoji { font-family: "Segoe UI Symbol", sans-serif; }
.md-diagram-panel > svg { max-width: 100%; }
[lang="mermaid"] svg, [lang="flow"] svg { max-width: 100%; }
[lang="mermaid"] .node text { font-size: 1rem; }
table tr th { border-bottom: 0px; }
video { max-width: 100%; display: block; margin: 0px auto; }
iframe { max-width: 100%; width: 100%; border: none; }
.highlight td, .highlight tr { border: 0px; }


:root { --control-text-color: #777; }
@font-face { font-family: Merriweather; font-style: normal; font-weight: 300; src: local("Merriweather Light"), local("Merriweather-Light"), url("./pixyll/Merriweather-Light.ttf"); }
@font-face { font-family: Merriweather; font-style: normal; font-weight: 900; src: local("Merriweather Heavy"), local("Merriweather-Heavy"), url("./pixyll/Merriweather-Bold.ttf"); }
@font-face { font-family: Merriweather; font-style: italic; font-weight: 300; src: local("Merriweather Light Italic"), local("Merriweather-LightItalic"), url("./pixyll/Merriweather-LightItalic.ttf"); }
@font-face { font-family: Merriweather; font-style: italic; font-weight: 900; src: local("Merriweather Heavy Italic"), local("Merriweather-HeavyItalic"), url("./pixyll/Merriweather-BoldItalic.ttf"); }
@font-face { font-family: Lato; font-style: normal; font-weight: 300; src: local("Lato Light"), local("Lato-Light"), url("./pixyll/Lato-Light.ttf"); }
@font-face { font-family: Lato; font-style: normal; font-weight: 900; src: local("Lato Black"), local("Lato-Blcak"), url("./pixyll/Lato-Black.ttf"); }
@font-face { font-family: Lato; font-style: normal; font-weight: bold; src: local("Lato Black"), local("Lato-Blcak"), url("./pixyll/Lato-Black.ttf"); }
@font-face { font-family: Lato; font-style: italic; font-weight: 900; src: local("Lato BlackItalic"), local("Lato-BlackItalic"), url("./pixyll/Lato-BlackItalic.ttf"); }
@font-face { font-family: Lato; font-style: italic; font-weight: bold; src: local("Lato BlackItalic"), local("Lato-BlackItalic"), url("./pixyll/Lato-BlackItalic.ttf"); }
h1, .h1, .f1 { font-size: 2rem; line-height: 2.5rem; }
h2, .h2, .f2 { font-size: 1.5rem; line-height: 2rem; }
h3, .h3, .f3 { font-size: 1.25rem; line-height: 1.5rem; }
p, .p, .f4, h4, h5, h6, dl, ol, ul, pre[cid], div[cid], #typora-source { font-size: 1.125rem; line-height: 1.5rem; }
h4 { font-size: 1.13rem; }
body { font-family: Merriweather, "PT Serif", Georgia, "Times New Roman", STSong, serif; line-height: 1.5rem; font-weight: 400; }
#write { max-width: 914px; color: rgb(51, 51, 51); }
img { width: auto; max-width: 100%; }
body { font-size: 1.5rem; box-sizing: border-box; }
.ty-table-edit { background: rgb(237, 237, 237); }
table { width: 100%; font-size: 1.125rem; }
table > thead > tr > th, table > thead > tr > td, table > tbody > tr > th, table > tbody > tr > td, table > tfoot > tr > th, table > tfoot > tr > td { padding: 12px; line-height: 1.2; vertical-align: top; border-top: 1px solid rgb(51, 51, 51); }
table > thead > tr > th { vertical-align: bottom; border-bottom: 2px solid rgb(51, 51, 51); }
table > caption + thead > tr:first-child > th, table > caption + thead > tr:first-child > td, table > colgroup + thead > tr:first-child > th, table > colgroup + thead > tr:first-child > td, table > thead:first-child > tr:first-child > th, table > thead:first-child > tr:first-child > td { border-top: 0px; }
table > tbody + tbody { border-top: 2px solid rgb(51, 51, 51); }
p { font-weight: 300; line-height: 1.5; }
abbr { border-bottom: 1px dotted black; cursor: help; }
pre, code { font-family: Menlo, Monaco, "Courier New", monospace; }
code, .md-fences { color: rgb(122, 122, 122); }
.md-fences { padding: 0.5rem 1.125em; margin-bottom: 0.88em; font-size: 1rem; border: 1px solid rgb(122, 122, 122); }
blockquote { padding: 1.33em; font-style: italic; border-left: 5px solid rgb(122, 122, 122); color: rgb(85, 85, 85); }
blockquote em { color: rgb(0, 0, 0); }
blockquote footer { font-size: 0.85rem; font-style: normal; background-color: rgb(255, 255, 255); color: rgb(122, 122, 122); border-color: transparent; }
h1, .h1, h2, .h2, h3, .h3, h4, .h4, h5, .h5, h6, .h6 { font-family: Lato, "Helvetica Neue", Helvetica, sans-serif; font-weight: 900; line-height: 1.2; margin: 1em 0px 0.5em; }
@media screen and (min-width: 48em) {
  .h1, h1 { font-size: 3.25rem; }
  .h2, h2 { font-size: 2.298rem; }
  .h3, h3 { font-size: 1.625rem; }
  .h4, h4 { font-size: 1.3rem; }
  #write > h4.md-focus::before, #write > h5.md-focus::before, #write > h6.md-focus::before { top: 1px; }
  .p, p, li { font-size: 1.25rem; line-height: 1.8; }
  table { font-size: 1.25rem; }
}
@media (max-width: 48em) {
  blockquote { margin-left: 1rem; margin-right: 0px; padding: 0.5em; }
  .h1, h1 { font-size: 2.827rem; }
  .h2, h2 { font-size: 1.999rem; }
  .h3, h3 { font-size: 1.413rem; }
  .h4, h4 { font-size: 1.3rem; }
}
@media screen and (min-width: 64em) {
  .h1, h1 { font-size: 4.498rem; }
  .h2, h2 { font-size: 2.29rem; }
  .h3, h3 { font-size: 1.9rem; }
  .h4, h4 { font-size: 1.591rem; }
  #write > h4.md-focus::before { top: 4px; }
}
a { color: rgb(70, 63, 92); text-decoration: underline; }
#write { padding-top: 2rem; }
#write pre.md-meta-block { min-height: 35px; padding: 2000px 1em 10px 0px; white-space: pre; border-width: 0px 30px; border-top-style: initial; border-bottom-style: initial; border-top-color: initial; border-bottom-color: initial; border-image: initial; border-left-style: solid; border-left-color: rgb(248, 248, 248); border-right-style: solid; border-right-color: rgb(248, 248, 248); width: 100vw; max-width: calc(100% + 60px); margin-left: -30px; margin-bottom: 2em; margin-top: -2010px; line-height: 1.5em; color: rgb(122, 122, 122); background-color: rgb(250, 250, 250); font-family: Lato, "Helvetica Neue", Helvetica, sans-serif; font-weight: 300; clear: both; font-size: 1.125rem; }
.md-image > .md-meta { color: rgb(70, 63, 92); }
.footnotes { font-size: 1.1rem; }
.md-tag { font-family: Lato, "Helvetica Neue", Helvetica, sans-serif; }
.code-tooltip { background: white; }
.code-tooltip-content { font-size: 1.1rem; }
.task-list { padding-left: 0px; }
.md-task-list-item { padding-left: 34px; }
.md-task-list-item > input { width: 1.25rem; height: 1.25rem; display: block; -webkit-appearance: initial; top: -2px; margin-left: -1.6em; margin-top: calc(1rem - 7px); }
.md-task-list-item > input:focus { outline: none; box-shadow: none; }
.md-task-list-item > input::before { border: 1px solid rgb(85, 85, 85); border-radius: 1.5rem; width: 1.5rem; height: 1.5rem; background: rgb(255, 255, 255); content: " "; transition: background-color 200ms ease-in-out; display: block; }
.md-task-list-item > input:checked::before, .md-task-list-item > input[checked]::before { background: rgb(51, 51, 51); border-width: 2px; display: inline-block; transition: background-color 200ms ease-in-out; }
.md-task-list-item > input:checked::after, .md-task-list-item > input[checked]::after { opacity: 1; }
.md-task-list-item > input::after { transition: opacity 0.05s ease-in-out; transform: rotate(-45deg); position: absolute; top: 0.4375rem; left: 0.28125rem; width: 0.9375rem; height: 0.5rem; border-width: 0px 0px 3px 3px; border-bottom-style: solid; border-left-style: solid; border-bottom-color: rgb(255, 255, 255); border-left-color: rgb(255, 255, 255); border-image: initial; border-top-style: initial; border-top-color: initial; border-right-style: initial; border-right-color: initial; content: " "; opacity: 0; }
.md-tag { color: inherit; }
.md-toc:focus .md-toc-content { margin-top: 19px; }
#typora-sidebar { font-size: 1rem !important; }
.html-for-mac #typora-sidebar { background-color: white; }
.outline-content li, .outline-content ul { font-size: 1rem !important; }
.outline-title { line-height: inherit; margin-top: 10px; }
.outline-expander { width: 18px; }
.outline-expander::before { content: "+"; font-family: inherit; color: rgb(108, 108, 108); font-size: 1.5rem; top: 0.1rem; }
.outline-expander:hover::before { content: "+"; }
.outline-item-open > .outline-item > .outline-expander::before { content: "-"; }
#typora-source { font-family: Courier, monospace; color: rgb(106, 106, 106); }
.os-windows #typora-source { font-family: inherit; }
.cm-s-typora-default .cm-header, .cm-s-typora-default .cm-property, .CodeMirror.cm-s-typora-default div.CodeMirror-cursor { color: rgb(66, 139, 202); }
.cm-s-typora-default .cm-atom, .cm-s-typora-default .cm-number { color: rgb(119, 119, 119); }
.preference-item-hint { margin-top: 16px; }
.md-diagram-panel { margin-top: 24px; margin-left: -1.2em; }
.md-mathjax-midline { background: rgb(250, 250, 250); }
.enable-diagrams pre.md-fences[lang="sequence"] .code-tooltip, .enable-diagrams pre.md-fences[lang="flow"] .code-tooltip, .enable-diagrams pre.md-fences[lang="mermaid"] .code-tooltip { bottom: -3.4em; }





 .typora-export p, .typora-export .footnote-line {white-space: normal;} 
</style>
</head>
<body class='typora-export os-windows' >
<div  id='write'  class = 'is-node'><h2><a name='header-n0' class='md-header-anchor '></a>Linux系统及程序设计 - 绪论</h2><h3><a name='header-n2' class='md-header-anchor '></a>课程介绍</h3><p>本课程是Linux系统基础的进阶课程，主要讲述Linux系统编程，并包括部分Web的内容，Web部分主要是Linux服务端搭建、Web架构与特点，系统编程部分主要使用C语言调用Linux系统接口（系统API）完成一些命令，由此更深入的理解Linux工作方式，并体会Linux/Unix平台的简洁、分工、组合的编程思想（KISS原则：Keep it small , stupid）。</p><p>本课程以编程实践为主，涉及到man查看的手册内容，并非全部内容，而是精简了一些系统API或是库函数的主要说明。你应该在需要时查看完整的手册。本课程的目的不仅仅是要告诉你如何使用系统API以及库函数实现需要的功能，更重要的是熟悉在Linux/Unix平台上的开发习惯，开发方式。理解Linux/Unix的设计思想。</p><p>课程总共16章，每一章分为多个小节，每一节带 * 的标题是选修内容，带#标题是课外拓展内容。</p><p>课程链接：<a href='https://github.com/master-genius/course-lsp' target='_blank' class='url'>https://github.com/master-genius/course-lsp</a></p><h3><a name='header-n7' class='md-header-anchor '></a>Linux平台简介与回顾</h3><p>熟悉Windows的用户可能觉得Linux使用量很小，并且很不好用。但事实是Linux平台在服务器市场以及嵌入式市场获得了巨大生命力，包括你见到的各种智能设备尽管它们提供了美观的界面，易用的操作方式，但是大部分都采用Linux内核。在这些领域Linux占有绝对的优势，而这种优势来自于Linux的高效设计，Linux继承自Unix禅宗般的简洁设计哲学，并且由于Linux是开源的，可以自由传播和使用，这还可以降低产品成本。</p><p>当然，使用Linux是需要付出一些努力的，需要一些时间去理解。当一旦能够熟练使用，就能够体会到Linux的强大，并且在其他领域也会有很好的帮助。</p><h3><a name='header-n10' class='md-header-anchor '></a>编程语言和工具</h3><p>本课程主要使用C语言，并且使用gcc编译工具。辅助使用shell脚本等其他脚本语言。</p><p>虽然本课程使用C实现相应的功能，但是理解了系统API的工作方式，使用一些高级语言如Java，Python等调用系统相关接口会更加得心应手，因为高级语言的接口都依赖于系统底层的实现。</p><p>glibc：GNU C Library project。GNU发布的C运行库，glibc可以说是包罗万象，囊括了几乎所有Unix的通行标准，这样编写的程序可移植性很强。并且glibc封装了非常原始的内核调用，对外提供简单易用的接口。</p><p>本课程使用的Linux环境可以是物理机安装的系统，也可以是虚拟机安装。对于使用物理机安装的系统来说，自带的终端支持多标签，除此之外，tilda和guake也是很好的选择，可以一键显示或隐藏窗口。使用虚拟机的情况，可以使用Putty，Xshell，MobaXterm。这三个都是ssh客户端，选择一个即可。</p><p>在终端环境里，有一个非常好用的开发工具：tmux。这个工具主要用于多标签，分屏等操作：</p><p><img src='putty-tmux-1.jpg' alt='' referrerPolicy='no-referrer' /></p><p>&nbsp;</p><p><img src='putty-tmux-2.jpg' alt='' referrerPolicy='no-referrer' /></p><p>&nbsp;</p><p><img src='putty-tmux-3.jpg' alt='' referrerPolicy='no-referrer' /></p><p>&nbsp;</p><p>putty+tmux是很好的组合，putty简洁单一的窗口启动tmux，对于开发来说是非常好的选择。</p><p><strong>传文件</strong>：如果需要上传文件到虚拟机，这里推荐两个软件：WinSCP，FileZilla。FileZilla支持Linux版本。putty工具集中有用于上传文件的命令，操作起来比较麻烦。对于虚拟机系统使用ssh服务的情况，客户端传文件使用的协议是sftp。</p><p><strong>代码编辑器</strong>：使用Vim作为主要的代码编辑工具，在桌面环境，使用Visual Studio Code、Sublime Text 3或是其他IDE工具也是可以的。</p><h3><a name='header-n25' class='md-header-anchor '></a>课程定位以及其他说明</h3><p>整个计算机领域从大方向划分，可分为硬件和软件，然而在硬件和软件对接的领域，比如编写设备驱动程序，程序和硬件耦合非常紧密，程序要针对不同硬件平台进行设计，而硬件的设计也会随着软件开发需求而变化。嵌入式也是一个需要软硬件结合的领域，嵌入式可以很简单，比如电梯控制，也可以很复杂，像火星探测器，据说好奇号火星探测器超过300万行代码，使用C语言编写，测试脚本使用的Python。</p><p>我们的专业属于纯粹的软件领域，不会直接和硬件打交道，当然如果能理解计算机硬件的基本运行原理对编写软件会很有帮助。</p><p>本课程除了可以让你更好的理解Linux运行原理、提高编程能力以外，对后续的课程以及工作也 ‘可能’ 会有所帮助，注意为什么用可能这个词，因为在实际的工作场景你不一定会涉及到相对底层的开发，比如我们都会使用PHP/Python/JavaScript/Java等高级语言编程，但是像PHP/Python等高级语言都支持C扩展，而且有些扩展为了运行效率必须要使用C开发。可是多数情况下我们是不需要自己去写C扩展的。</p><p>再比如Redis、Memcached等这些中间件服务程序，作为内存型数据库用于数据快速存取，并且Redis还可作为消息队列使用。这些程序都是使用C语言开发的，并且都提供在Linux平台上版本，Linux提供了epoll函数实现了IO多路复用，Redis基于此开发，所以性能非常高。而Windows上并未开放类似的接口，所以Redis官方并未提供Windows版本。其他提供服务的程序：Nginx，Apache等都是用C语言开发的，Nginx同样是基于Linux 的epoll接口实现了高并发的处理。</p><p>本课程会对这些技术依赖的底层系统调用以及运行机制使用程序示例做一个简要说明。如果你感兴趣，可以看看《Linux system programming》以及《Advanced Programming in the UNIX Environment third edition》（《Unix环境高级编程 第三版》简称《APUE》）后者可以说是大名鼎鼎，目前最新版是第三版，删除了过时的接口，增加了新的接口，针对Unix以及类Unix几种主流系统都提供了比较好的描述和实例。</p><h3><a name='header-n31' class='md-header-anchor '></a>准备工作</h3><p>学生要具备C语言基础，Linux系统基础，最好能理解基本的数据结构和算法，一台能够运行Linux环境的设备，建议使用物理机安装Linux系统，虚拟机环境也可以。</p><p>本节课主要任务就是安装Linux操作系统，并且安装gcc以及vim，可以使用桌面版本Linux，并且可以使用visual studio code、sublime text 3等桌面环境的开发工具。（visual studio code不是visual studio，是微软提供的一个免费的代码编辑器，支持Linux版本）。</p><h3><a name='header-n34' class='md-header-anchor '></a>Linux发行版</h3><h4><a name='header-n35' class='md-header-anchor '></a>deepin</h4><p>deepin是国内开发的一个Linux发行版，可以称得上桌面环境最好看的发行版，在国外也有很多的用户使用量。桌面环境是完全自主研发的，没有使用gnome，kde等进行二次开发，使用体验会更好。并且提供了一些其他桌面环境没有的工具。deepin开发公司购买了crossover版权，这样你无需付费就可以使用crossover运行Windows程序。另一个比较好的体验是deepin的联机文档很多是翻译成中文的。deepin经过了很多年的发展，综合使用体验deepin对国内来说是最好的。</p><h4><a name='header-n37' class='md-header-anchor '></a>Mint</h4><p>这个版本在使用排名上一直稳居第一（现在Mint排名居于第二，第一名被Manjaro抢占），Mint有一个基于gnome3开发的桌面环境cinnamon。除此以外，还提供Mate桌面版本以及Xfce桌面版本。Mint主要针对Linux新手，普通用户做了很多设计。实际上对开发人员来说也是非常好的选择。Mint基于Ubuntu进行开发，但是桌面环境更好用一点。</p><h4><a name='header-n39' class='md-header-anchor '></a>Ubuntu</h4><p>Ubuntu上手方便，很多开发要用到的环境都是配置好的，Ubuntu的桌面版本比较激进，追求软件、内核的最新版本。不过UbuntuServer版本部署在服务器上还是很稳定的。Ubuntu基于Debian开发，并针对用户体验做了优化，Ubuntu是公司运营的，会有一些商业相关的预装软件，不过可以卸载。曾经Ubuntu基于gnome开发了自己的桌面环境unity，从Ubuntu18.04开始，使用gnome3作为默认桌面环境，放弃了unity。Ubuntu的特点就是上手更容易，集成的开发库也比较全面，尤其是基于Debian的包管理非常方便，软件库也比较全。</p><h4><a name='header-n41' class='md-header-anchor '></a>Debian</h4><p>社区驱动的Linux发行版，Debian是绝对开源的发行版，不会有任何的商业成分。Debian是一个社区开发的版本，没有公司去运营。但是很多发行版都直接或间接基于Debian。使用Debian需要一些更多的设置，不过当前Debian也针对用户的使用体验做了很多工作，对语言的支持也更完善。但是软件的更新程度不像Ubuntu，比较慢，甚至有时候很长时间不更新，往往需要手动更新。</p><h4><a name='header-n43' class='md-header-anchor '></a>CentOS</h4><p>RedHat发布的开源版本，国内使用很多，软件更新慢，追求稳定，多用于部署服务器。不过现在使用Ubuntu/Debian部署的服务器也在增加。CentOS和RetHat使用相同的包管理程序。尽管你在网上会找到很多为何多数使用CentOS部署服务器的说明，但是那些都是个人之见，因素是多种多样的，当你想部署服务的时候，Ubuntu，Debian，CentOS都是很好的选择。</p><h4><a name='header-n45' class='md-header-anchor '></a>Manjaro</h4><p>从发布以来，排名一直上升，现在居于第一。基于Arch开发，Arch虽然功能强大，但是需要大量配置，不是很好用。并且不适合新手。所以才有了manjaro项目，融合Arch的优势，同时提供更好用的桌面环境。</p><p>&nbsp;</p><blockquote><p>！2018年8月28日，测试发现很多发行版都出现了无法引导的问题，据其他人反应，很多人都出现了这个问题，据说是最新版本的系统启动程序存在bug。目前我个人使用来看，Ubuntu16.04，18.04都可以正常使用，CentOS7也没有问题。Manjaro、Deepin都出现了此问题，Mint最新版本基于Ubuntu18.04开发，双系统安装出现重启后进不去系统的问题（报错：PCIe Error，此问题需要修改grub配置文件，这个问题比较好解决，Ubuntu只有在切换到控制台才会出现，而Mint出现的问题是直接进不去系统）。</p><p>！如果你使用虚拟机运行Mint桌面环境会进入软件渲染模式，界面很卡，可以尝试其他发行版，根据配置信息可以选择桌面版还是Server版。</p></blockquote><p>&nbsp;</p></div>
</body>
</html>